package cn.lcsjsxy.yxc.objectoriented.static关键字的引入;

/**
 * static关键字的使用
 * <p>
 * 一.static：静态的
 * 二.static可以用来修饰：属性、方法、代码块、com.yang_xc.objectoriented.内部类
 * <p>
 * 三.使用static修饰属性：静态变量（或类变量）
 *      3.1属性：按是否使用static修饰，有分为：静态属性 Vs 非静态熟悉感（实例变量）
 *      实例变量：我们创造了类的多个对象，每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象中的非静态属性时，不会导致其他对象中同样的属性值的修改。
 *      静态变量：我们创建了类的多个对象，多个对象共享同一个静态变量。当通过某一个对象修改静态变量时，会导致其他对象调用此静态变量时，是修改过的
 *      3.2static修饰属性的说明：
 *          1.静态变量随着类的加载而加载.可以通过“类.静态变量"的方式进行调用
 *          2.静态变量的加载要早于对象的创建
 *          3.由于类只会加载一次，则静态变量在内存中也只会存在一份，存在方法区的静态域中。
 *          4.  类变量     实例变量
 *          类    yes        no
 *          对象  yes        yes
 *      3.3静态属性举例：System.out;Math.PI;
 * <p>
 * 四.使用static修饰方法：静态方法
 *      1.随着类的加载而加载，可以通过“类.静态方法"的方式进行调用
 *      2.    静态方法      非静态方法
 *      类    yes         no
 *      对象  yes         yes
 *      3.静态方法中，只能调用静态的方法或属性
 *      非静态方法中，既可以调用非静态的方法或属性，也可以调用静态的方法和属性
 * 五.static注意点
 *      5.1在静态的方法内，不能使用this关键字、com.yang_xc.objectoriented.super关键字
 *      5.2关于静态属性和静态方法的使用，大家都从生命周期的角度去理解
 * 六.开发中，如何确定一个属性是否要声明为static的？
 *      》属性是可以被多个对象所共享的，不会随着对象的不同而不同的。
 *
 *    开发中，如何确定一个方法要声明为static的？
 *      》操作静态属性的方法，通常设置为static的
 *      》工具类中的方法，习惯上声明为static的。比如：Math、Arrays、Collections
 */
public class StaticTest {
    public static void main(String[] args) {
        Chinese.nation = "中国";
        Chinese.eat();

        Chinese c1 = new Chinese();
        c1.age = 17;
        c1.name = "Yxc";

        Chinese c2 = new Chinese();
        c2.age = 17;
        c2.name = "H";
        System.out.println(c2.nation);
    }
}

class Chinese {
    String name;
    int age;
    static String nation;

    public static void eat() {
        System.out.println("吃吃吃吃吃吃吃");
    }
}
